#ifndef CAMERA_H
#define CAMERA_H
#include <string>
#include "../utils/MyFloat.h"
#include <iostream>

/**
 * @class Camera
 * @brief Camera is responsible for managing the camera moves a zoom
 * Description:
 *  Camera is responsible for moving the game Camera withing the limits
 *  The class is implemented as a singleton and should be used by calling
 *  the static function instance() to instanciate the class.
 *  The constructor is private.
  */

class Camera
{
protected:
    Camera ( );

public:
  /**
   * Empty Destructor
   */
  virtual ~Camera ( );

  /**
   */
  void setZoom ( )
  {
  }

/**
 * @brief this function creates a single instance of the class
 * @return a pointer on a singleton instance of the class
 *
 * Description:
 * This function should be used to create a single instance of the class
 */
    static Camera* instance ( );

  /**
   * @param  x
   * @param  y
   * @param  z
   */
  void setPosition (MyFloat x, MyFloat y, MyFloat z )
  {
  }

  /**
   * Set the value of x
   * @param new_var the new value of x
   */
  void setX ( MyFloat new_var )	 {
    x = new_var;
  }

  /**
   * Get the value of x
   * @return the value of x
   */
  MyFloat getX ( )	 {
    return x;
  }

  /**
   * Set the value of y
   * @param new_var the new value of y
   */
  void setY ( MyFloat new_var )	 {
    y = new_var;
  }

  /**
   * Get the value of y
   * @return the value of y
   */
  MyFloat getY ( )	 {
    return y;
  }

  /**
   * Set the value of z
   * @param new_var the new value of z
   */
  void setZ ( MyFloat new_var )	 {
    z = new_var;
  }

  /**
   * Get the value of z
   * @return the value of z
   */
  MyFloat getZ ( )	 {
    return z;
  }

  /**
   * Set the value of zoom
   * @param new_var the new value of zoom
   */
  void setZoom ( MyFloat new_var )	 {
    zoom = new_var;
  }

  /**
   * Get the value of zoom
   * @return the value of zoom
   */
  MyFloat getZoom ( )	 {
    return zoom;
  }

protected:
    static Camera* instance_ptr ;  /**< pointer to the unique instance of the class */
private:
  MyFloat XMIN;  /**< position limit when moving camera */
  MyFloat YMIN;  /**< position limit when moving camera */
  MyFloat XMAX;  /**< position limit when moving camera */
  MyFloat YMAX;  /**< position limit when moving camera */
  MyFloat x;  /**< current position of the moving camera on x axis*/
  MyFloat y;  /**< current position of the moving camera on y axis*/
  MyFloat z;  /**< current position of the moving camera on z axis*/
  MyFloat zoom; /**< current zoom of the moving camera*/


};

#endif // CAMERA_H
